{"componentChunkName":"component---src-templates-post-js","path":"/blog/react-context","result":{"data":{"markdownRemark":{"html":"<p>\n<span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto;  max-width: 700px;\"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/ab3ce25e8bc60261540c968ea8191f83/797d6/thumbnail.jpg\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 65.14285714285714%; position: relative; bottom: 0; left: 0; background-image: url('data:image/svg+xml,%3csvg%20xmlns=\\'http://www.w3.org/2000/svg\\'%20width=\\'400\\'%20height=\\'260\\'%20viewBox=\\'0%200%20400%20260\\'%20preserveAspectRatio=\\'none\\'%3e%3cpath%20d=\\'M0%20130v130h401V0H0v130m31-95v11h4l4-1c0-1-1-2-3-2h-3v-8c0-11%202-12%208-4l4%204c1%200%201-1-4-7-3-3-4-4-7-4h-3v11m13-10c-1%201%200%201%201%201h3c1%200%202%203%202%209%200%208%200%208-2%208s-4-2-6-5c-3-4-5-5-5-3l4%206c3%204%204%205%207%205h4V24h-4l-4%201M31%2073v8h5l6-1c1-1%200-6-1-6v-2c2-3%200-6-3-6h-5c-2-1-2%200-2%207m154-5c0%203%200%203-3%202-3%200-4%200-5%202-4%205-1%209%205%209h5l-1-6c0-8-1-11-1-7m32%204c-4%204-2%209%203%209%204%200%206-2%206-5%200-5-6-8-9-4m-64%2029c-7%201-12%209-10%2016%203%2010%2014%2014%2021%207%203-2%202-3%200-4h-4c-3%203-5%202-8%200-8-6%200-18%208-12h4c5-3-4-9-11-7M31%20114v13h3c3%200%203-1%203-4%200-6%204-6%207%200%202%203%203%204%206%204h3l-2-4-3-5%202-3c3-5%202-8-1-12-2-2-3-2-10-2h-8v13m91-12l-1%203-1%203-1%202%201%202%201%206c0%208%202%2011%208%2010%204-1%204-6%201-6-4-1-4-10-1-10l2-2-2-2c-2%200-2-1-2-3%200-3%200-4-2-4l-3%201m94%200l-1%203-1%203-1%202%201%202%201%206c0%208%202%2011%207%209l4-1c2-1%200-4-2-4-4-1-4-10-1-10l2-2-2-2c-2%200-2-1-2-3%200-3%200-4-2-4l-3%201m56%202l-1%204-2%202%202%202%201%207c0%206%200%207%202%208s9%200%209-1c0-2-1-4-3-4s-2-1-2-5%200-5%202-5l2-2-2-2c-1%200-2-1-2-3%200-3-1-4-3-4-3%200-3%200-3%203m-212%205c-5%202-6%204-6%209%200%208%207%2012%2015%208l4-3c0-1-4-2-5-1-2%202-8%201-8-2l8-1c8%200%208-1%205-6-2-5-8-7-13-4m21-1c-4%202-4%203-3%205h4c3-1%206-1%206%201l-4%201c-9%200-11%2010-3%2013l5-1%204-1%205%201v-7c-1-11-6-14-14-12m92%200c-7%204-7%2015%201%2019%209%203%2017-5%2014-13-3-6-9-8-15-6m29%200l-4%201h-1l-3-1h-3v19h7v-6c0-6%202-9%204-8s2%203%202%207v7h6v-8c0-10-2-13-8-11m31%200c-8%204-7%2016%202%2019%204%201%2011-1%2012-4%200-1-4-2-5-1-2%202-8%201-8-2l7-1c8%200%209-1%207-5-3-6-9-8-15-6m-132%203c-8%207%201%2020%2011%2016%207-3%206-7-1-6-5%201-7%200-7-3%200-4%202-5%207-4%205%200%207-1%204-4s-11-3-14%201m148-2l3%204%202%205-2%204c-4%204-4%205%200%205l4-2%202-3s2%201%202%203l5%202c4%200%204%200%200-5l-3-5%203-4%203-4-3-1c-2%200-3%201-5%203l-2%202-2-2c-1-3-7-4-7-2\\'%20fill=\\'%2345aaf2\\'%20fill-rule=\\'evenodd\\'/%3e%3c/svg%3e'); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"react context guide\"\n        title=\"react context guide\"\n        src=\"/static/ab3ce25e8bc60261540c968ea8191f83/03346/thumbnail.jpg\"\n        srcset=\"/static/ab3ce25e8bc60261540c968ea8191f83/71299/thumbnail.jpg 175w,\n/static/ab3ce25e8bc60261540c968ea8191f83/1e9fe/thumbnail.jpg 350w,\n/static/ab3ce25e8bc60261540c968ea8191f83/03346/thumbnail.jpg 700w,\n/static/ab3ce25e8bc60261540c968ea8191f83/c3223/thumbnail.jpg 1050w,\n/static/ab3ce25e8bc60261540c968ea8191f83/797d6/thumbnail.jpg 1080w\"\n        sizes=\"(max-width: 700px) 100vw, 700px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n  </a>\n    </span></p>\n<h2>Intro</h2>\n<p>In this post we're going to understand basic concepts of React Context and after that we learn how to implement context in an application in both functional components and class components. Then we cover some best practices on how to handle context in applications.</p>\n<h2>Concept</h2>\n<p>Before we implement context in our application we should understand the concept and possible use cases it has. According to official react docs: </p>\n<blockquote>\n<p>Context provides a way to pass data through the component tree without having to pass props down manually at every level.</p>\n</blockquote>\n<p>There are some types of props that several components at different levels of project tree need access to. In this case, if we provide the props manually through the application we find ourselves with several components with props that are just getting passed to lower levels of project tree without any actual usage inside that component (which is known as <code class=\"language-text\">Prop Drilling</code>). This can pollute our component props and cause pain and confusion in the debugging phase.</p>\n<blockquote>\n<p>Context is designed to share data that can be considered “global”</p>\n</blockquote>\n<p>We can consider context as a global store where data lives, and all the data in this store (and any changes that will be made in the future) will be broadcasted to any component that needs it. For example, some use cases the Context API is ideal for: theming, user language, authentication, etc.</p>\n<h2>Implementation</h2>\n<p>Context comes with two components: <code class=\"language-text\">Provider</code> and <code class=\"language-text\">Consumer</code>. Provider is used every time we need to create a context object, after that we can access values from it with the consumer component.</p>\n<p>The process of creating a provider is the same with functional and class components, the only difference is in implementing consumers.</p>\n<p>For better understanding, We are going to use context to implement a dark-mode feature in a project. First we have to initialize our context object. Then we have to create our provider which has a dark-mode state and a toggle method inside it. We can have access to state and toggler method through provider.</p>\n<div class=\"gatsby-code-title\">theme-context.js</div>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"language-jsx\"><code class=\"language-jsx\"><span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> useState <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">\"react\"</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// Class component context</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">const</span> ClassContext <span class=\"token operator\">=</span> React<span class=\"token punctuation\">.</span><span class=\"token function\">createContext</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">const</span> <span class=\"token function-variable function\">ClassProvider</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\"><span class=\"token punctuation\">{</span> children <span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> <span class=\"token punctuation\">[</span>darkMode<span class=\"token punctuation\">,</span> setDarkMode<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token function\">useState</span><span class=\"token punctuation\">(</span><span class=\"token boolean\">false</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">const</span> <span class=\"token function-variable function\">toggleDarkMode</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token function\">setDarkMode</span><span class=\"token punctuation\">(</span><span class=\"token operator\">!</span>darkMode<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">ClassContext.Provider</span></span> <span class=\"token attr-name\">value</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">{</span> darkMode<span class=\"token punctuation\">,</span> toggleDarkMode <span class=\"token punctuation\">}</span><span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n      </span><span class=\"token punctuation\">{</span>children<span class=\"token punctuation\">}</span><span class=\"token plain-text\">\n    </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span><span class=\"token class-name\">ClassContext.Provider</span></span><span class=\"token punctuation\">></span></span>\n  <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>Then we have to wrap the part of our app that needs access to context with the provider. In this scenario, we have a class component that has a <code class=\"language-text\">&lt;Content /&gt;</code> and a button inside it, and clicking the button will trigger the toggler method which changes the content of our <code class=\"language-text\">&lt;Content /&gt;</code></p>\n<div class=\"gatsby-code-title\">App.js</div>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"language-jsx\"><code class=\"language-jsx\"><span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> ClassProvider <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">\"./contexts/theme-context\"</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> ClassComponent <span class=\"token keyword\">from</span> <span class=\"token string\">\"./componenst/class-component\"</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">const</span> <span class=\"token function-variable function\">App</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span> <span class=\"token attr-name\">className</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>app-container<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\"></span>\n<span class=\"gatsby-highlight-code-line\"><span class=\"token plain-text\">      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">ClassProvider</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\"> </span></span><span class=\"gatsby-highlight-code-line\"><span class=\"token plain-text\">        </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">ClassComponent</span></span> <span class=\"token punctuation\">/></span></span><span class=\"token plain-text\"></span></span><span class=\"gatsby-highlight-code-line\"><span class=\"token plain-text\">      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span><span class=\"token class-name\">ClassProvider</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\"> </span></span><span class=\"token plain-text\">    </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> App<span class=\"token punctuation\">;</span></code></pre></div>\n<p>Here in the <code class=\"language-text\">&lt;ClassComponent /&gt;</code> we have to use the consumer variable inside <code class=\"language-text\">classContext</code>. Keep in mind that the child of a context consumer <strong>should always be</strong> a function that receives the variables and methods we need from context.</p>\n<div class=\"gatsby-code-title\">class-component.js</div>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"language-jsx\"><code class=\"language-jsx\"><span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> Component <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">\"react\"</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> Content <span class=\"token keyword\">from</span> <span class=\"token string\">\"./content\"</span><span class=\"token punctuation\">;</span>\n<span class=\"gatsby-highlight-code-line\"><span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> ClassContext <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">\"../contexts/theme-context\"</span><span class=\"token punctuation\">;</span></span>\n<span class=\"token keyword\">class</span> <span class=\"token class-name\">classComponent</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\">Component</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">render</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n      <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">ClassContext.Consumer</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\"> </span>\n<span class=\"gatsby-highlight-code-line\"><span class=\"token plain-text\">        </span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">(</span><span class=\"token parameter\"><span class=\"token punctuation\">{</span> darkMode<span class=\"token punctuation\">,</span> toggleDarkMode <span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span></span>          <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n            <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span> <span class=\"token attr-name\">className</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>class-component<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\"></span>\n<span class=\"token plain-text\">              </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Content</span></span> <span class=\"token attr-name\">darkMode</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>darkMode<span class=\"token punctuation\">}</span></span> <span class=\"token punctuation\">/></span></span><span class=\"token plain-text\"></span>\n<span class=\"token plain-text\">              </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>button</span>\n                <span class=\"token attr-name\">className</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span><span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">toggle </span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>darkMode <span class=\"token operator\">&amp;&amp;</span> <span class=\"token string\">\"dark-mode\"</span><span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">}</span></span>\n                <span class=\"token attr-name\">onClick</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token function\">toggleDarkMode</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span></span>\n              <span class=\"token punctuation\">></span></span><span class=\"token plain-text\"></span>\n<span class=\"token plain-text\">                Switch to </span><span class=\"token punctuation\">{</span>darkMode <span class=\"token operator\">?</span> <span class=\"token string\">\"Day\"</span> <span class=\"token operator\">:</span> <span class=\"token string\">\"Night\"</span><span class=\"token punctuation\">}</span><span class=\"token plain-text\"></span>\n<span class=\"token plain-text\">              </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>button</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\"></span>\n<span class=\"token plain-text\">            </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">></span></span>\n          <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span><span class=\"token punctuation\">}</span><span class=\"token plain-text\"></span>\n<span class=\"token plain-text\">      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span><span class=\"token class-name\">ClassContext.Consumer</span></span><span class=\"token punctuation\">></span></span> \n    <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> classComponent<span class=\"token punctuation\">;</span></code></pre></div>\n<p>And finally in <code class=\"language-text\">&lt;Content /&gt;</code> we have a bunch of if statements that changes the render every time we change the value in context:</p>\n<div class=\"gatsby-code-title\">class-component.js</div>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"language-jsx\"><code class=\"language-jsx\"><span class=\"token keyword\">import</span> <span class=\"token string\">\"../styles.scss\"</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> Moon <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">\"../assets/moon\"</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> Sun <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">\"../assets/sun\"</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">const</span> <span class=\"token function-variable function\">Content</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\"><span class=\"token punctuation\">{</span> darkMode <span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n<span class=\"gatsby-highlight-code-line\">    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span> <span class=\"token attr-name\">className</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span><span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">content-container </span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>darkMode <span class=\"token operator\">&amp;&amp;</span> <span class=\"token string\">\"dark-mode\"</span><span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\"></span></span><span class=\"token plain-text\">      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span> <span class=\"token attr-name\">className</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>status-card<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\"></span>\n<span class=\"gatsby-highlight-code-line\"><span class=\"token plain-text\">        </span><span class=\"token punctuation\">{</span>darkMode <span class=\"token operator\">?</span> <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Moon</span></span> <span class=\"token punctuation\">/></span></span> <span class=\"token operator\">:</span> <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Sun</span></span> <span class=\"token punctuation\">/></span></span><span class=\"token punctuation\">}</span><span class=\"token plain-text\"> </span></span><span class=\"token plain-text\">        </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span> <span class=\"token attr-name\">className</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>card-title<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\"></span>\n<span class=\"gatsby-highlight-code-line\"><span class=\"token plain-text\">          </span><span class=\"token punctuation\">{</span>darkMode <span class=\"token operator\">?</span> <span class=\"token string\">\"Good Night!\"</span> <span class=\"token operator\">:</span> <span class=\"token string\">\"Good Morning!\"</span><span class=\"token punctuation\">}</span><span class=\"token plain-text\"></span></span><span class=\"token plain-text\">        </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\"></span>\n<span class=\"token plain-text\">      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\"></span>\n<span class=\"token plain-text\">    </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> Content<span class=\"token punctuation\">;</span></code></pre></div>\n<p>Congrats, you have successfully implemented context in your app.</p>\n<p>Now what if you need to divide your application into two sections and use different providers for each section?</p>\n<p>For learning purposes, imagine we need to implement the same dark-mode application, but this time we use functional components and hooks.</p>\n<p>Let’s start with a second provider, but with the same variables and properties:</p>\n<div class=\"gatsby-code-title\">theme-context.js</div>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"language-jsx\"><code class=\"language-jsx\"><span class=\"token comment\">// Functional component context</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">const</span> FunctionalContext <span class=\"token operator\">=</span> React<span class=\"token punctuation\">.</span><span class=\"token function\">createContext</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">const</span> <span class=\"token function-variable function\">FunctionalProvider</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\"><span class=\"token punctuation\">{</span> children <span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> <span class=\"token punctuation\">[</span>darkMode<span class=\"token punctuation\">,</span> setDarkMode<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token function\">useState</span><span class=\"token punctuation\">(</span><span class=\"token boolean\">false</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">const</span> <span class=\"token function-variable function\">toggleDarkMode</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token function\">setDarkMode</span><span class=\"token punctuation\">(</span><span class=\"token operator\">!</span>darkMode<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">FunctionalContext.Provider</span></span> <span class=\"token attr-name\">value</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">{</span> darkMode<span class=\"token punctuation\">,</span> toggleDarkMode <span class=\"token punctuation\">}</span><span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n      </span><span class=\"token punctuation\">{</span>children<span class=\"token punctuation\">}</span><span class=\"token plain-text\">\n    </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span><span class=\"token class-name\">FunctionalContext.Provider</span></span><span class=\"token punctuation\">></span></span>\n  <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>Now let’s wrap the new section of our app (we’ll call it <code class=\"language-text\">FunctionalComponent</code>) with the provider we just created in `<App />:</p>\n<div class=\"gatsby-code-title\">App.js</div>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"language-jsx\"><code class=\"language-jsx\"><span class=\"token keyword\">import</span> <span class=\"token string\">\"./styles.scss\"</span><span class=\"token punctuation\">;</span>\n<span class=\"gatsby-highlight-code-line\"><span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> ClassProvider<span class=\"token punctuation\">,</span> FunctionalProvider <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">\"./contexts/theme-context\"</span><span class=\"token punctuation\">;</span></span><span class=\"token keyword\">import</span> ClassComponent <span class=\"token keyword\">from</span> <span class=\"token string\">\"./componenst/class-component\"</span><span class=\"token punctuation\">;</span>\n<span class=\"gatsby-highlight-code-line\"><span class=\"token keyword\">import</span> FunctionalComponent <span class=\"token keyword\">from</span> <span class=\"token string\">\"./componenst/functional-component\"</span><span class=\"token punctuation\">;</span></span>\n<span class=\"token keyword\">const</span> <span class=\"token function-variable function\">App</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span> <span class=\"token attr-name\">className</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>app-container<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\"></span>\n<span class=\"token plain-text\">      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">ClassProvider</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\"></span>\n<span class=\"token plain-text\">        </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">ClassComponent</span></span> <span class=\"token punctuation\">/></span></span><span class=\"token plain-text\"></span>\n<span class=\"token plain-text\">      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span><span class=\"token class-name\">ClassProvider</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\"></span>\n<span class=\"token plain-text\"></span>\n<span class=\"gatsby-highlight-code-line\"><span class=\"token plain-text\">      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">FunctionalProvider</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\"></span></span><span class=\"gatsby-highlight-code-line\"><span class=\"token plain-text\">        </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">FunctionalComponent</span></span> <span class=\"token punctuation\">/></span></span><span class=\"token plain-text\"></span></span><span class=\"gatsby-highlight-code-line\"><span class=\"token plain-text\">      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span><span class=\"token class-name\">FunctionalProvider</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\"></span></span><span class=\"token plain-text\"></span>\n<span class=\"token plain-text\">    </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> App<span class=\"token punctuation\">;</span></code></pre></div>\n<p>In the <code class=\"language-text\">&lt;FunctionalComponent /&gt;</code> we don’t need to use consumer variable from context, instead we can use a react hook called <code class=\"language-text\">useContext</code> and pass the actual context to it to access any variable or method we need from it: </p>\n<div class=\"gatsby-code-title\">functional-component.js</div>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"language-jsx\"><code class=\"language-jsx\"><span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> useContext <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">\"react\"</span><span class=\"token punctuation\">;</span>\n<span class=\"gatsby-highlight-code-line\"><span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> FunctionalContext <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">\"../contexts/theme-context\"</span><span class=\"token punctuation\">;</span></span><span class=\"token keyword\">import</span> Content <span class=\"token keyword\">from</span> <span class=\"token string\">\"./content\"</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> <span class=\"token keyword\">function</span> <span class=\"token function\">FunctionalComponent</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n<span class=\"gatsby-highlight-code-line\">  <span class=\"token keyword\">const</span> <span class=\"token punctuation\">{</span> darkMode<span class=\"token punctuation\">,</span> toggleDarkMode <span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> <span class=\"token function\">useContext</span><span class=\"token punctuation\">(</span>FunctionalContext<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></span>\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span> <span class=\"token attr-name\">className</span><span class=\"token attr-value\"><span class=\"token punctuation\">=</span><span class=\"token punctuation\">\"</span>functional-component<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\"></span>\n<span class=\"token plain-text\">      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Content</span></span> <span class=\"token attr-name\">darkMode</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>darkMode<span class=\"token punctuation\">}</span></span> <span class=\"token punctuation\">/></span></span><span class=\"token plain-text\"></span>\n<span class=\"token plain-text\">      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>button</span>\n        <span class=\"token attr-name\">className</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span><span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">toggle </span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>darkMode <span class=\"token operator\">&amp;&amp;</span> <span class=\"token string\">\"dark-mode\"</span><span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">}</span></span>\n        <span class=\"token attr-name\">onClick</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token function\">toggleDarkMode</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span></span>\n      <span class=\"token punctuation\">></span></span><span class=\"token plain-text\"></span>\n<span class=\"token plain-text\">        Switch to </span><span class=\"token punctuation\">{</span>darkMode <span class=\"token operator\">?</span> <span class=\"token string\">\"Day\"</span> <span class=\"token operator\">:</span> <span class=\"token string\">\"Night\"</span><span class=\"token punctuation\">}</span><span class=\"token plain-text\"></span>\n<span class=\"token plain-text\">      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>button</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\"></span>\n<span class=\"token plain-text\">    </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h2>Conclusion</h2>\n<p>Context is definitely a great approach if you need to avoid prop-drilling and want to write cleaner codes. But, if you’re thinking about replacing a complex state-management system like Redux with context, you might want to think twice and consider the limitations it offers. It may not be a suitable alternative to redux in complex state management or large scale projects, but if you’re working on a small project with few global states and want to avoid Redux boilerplates, context might be a good choice.</p>\n<p><a href=\"https://codesandbox.io/s/react-context-example-tqidu\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">See the example in codesandbox</a></p>\n<h2>References</h2>\n<p><a href=\"https://reactjs.org/docs/context.html\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">React Docs</a></p>\n<p><a href=\"https://kentcdodds.com/blog/how-to-use-react-context-effectively\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Kent C. Dodds Article</a></p>","frontmatter":{"title":"Beginners guide to React Context","description":"In this post we're going to find out how to use context and what are the best practices for using context in any project","date":"2021-08-29","slug":"/blog/react-context","tags":["React","Context","Hooks","State Management","Global State"]}}},"pageContext":{}}}